#ifndef __NET_TYPE_HPP__
#define __NET_TYPE_HPP__

namespace PocketSurvival
{
    // struct NetVector3
    // {
    //     Vector3 base;
    //     Vector3 next;
    //     float elapsedTime;

    //     inline NetVector3(const Vector3 &vec) : base(vec), next(vec), elapsedTime(1.0f) {}
    //     inline void setNext(const Vector3 &vec)
    //     {
    //         base = next;
    //         next = vec;
    //         elapsedTime = 0.0f;
    //     }
    //     inline Vector3 getUpdate(float dt)
    //     {
    //         elapsedTime += dt * 5;
    //         if (elapsedTime >= 1.0f)
    //         {
    //             return next;
    //         }
    //         return Vector3::Lerp(base, next, elapsedTime);
    //     }
    // };

    template<class T>
    struct NetSimulate
    {
        T base;
        T next;
        T updateResult;
        float elapsedTime;

        NetSimulate() = default;
        inline NetSimulate(const T &t) : base(t), next(t), elapsedTime(1.0f) {}
        inline void Init(const T &t)
        {
            base = t;
            next = t;
            elapsedTime = 1.0f;
        }
        inline void setNext(const T &t)
        {
            base = next;
            next = t;
            elapsedTime = 0.0f;
        }
        inline const T& getUpdate(float dt)
        {
            elapsedTime += dt * 5;
            if (elapsedTime >= 1.0f)
            {
                return next;
            }
            T::Lerp(base, next, elapsedTime, updateResult);
            return updateResult;
        }

        inline void getUpdate(float dt, T& result)
        {
            elapsedTime += dt * 5;
            if(elapsedTime >= 1.0f)
            {
                result = next;
                return;
            }
            T::Lerp(base, next, elapsedTime, result);
        }
    };
    

} // namespace PocketSurvival

#endif
